home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / c / stut_src / ramselec.c < prev    next >
C/C++ Source or Header  |  1996-05-27  |  35KB  |  1,295 lines

  1. /*
  2.  * ramselec.c
  3.  *
  4.  * Purpose:
  5.  * --------
  6.  * Gestion de S‚lecteurs d'objets 
  7.  * - op‚rant sur des objets en m‚moire vive (non pas sur disque)
  8.  *        - 
  9.  * - op‚rant sur une/deux liste(s) textuelle(s) avec boutons d'action
  10.  *     - select_in_list()
  11.  *
  12.  * History:
  13.  * --------
  14.  * 1993: fplanque: Created
  15.  */
  16.  
  17.  
  18.      #include "!OPTIONS.H"                /* Options de compilation */         
  19.     #define    THIS_FILE    "RAMSELEC.C v1.00 - 03.95"
  20.           
  21.  
  22. /*
  23.  * System headers:
  24.  */
  25.     #include    <stdio.h>
  26.     #include    <string.h>                    /* strcpy() etc.. */
  27.     #include    <aes.h>                        /* header AES */
  28.    
  29.  
  30. /*
  31.  * Custom headers:
  32.  */
  33.     #include    "SPEC_PU.H"
  34.     #include "S_MALLOC.H"
  35.     #include "STUT_ONE.RSC\STUT_3.H"                    /* noms des objets ds le ressource */
  36.     #include    "TEXT_PU.H"                        /* Params texte */
  37.     #include    "RAMSL_PU.H"        /* ListHandles */
  38.  
  39. /*
  40.  * ------------------------ PROTOTYPES -------------------------
  41.  */
  42.  
  43. /*
  44.  * EXTernal prototypes:
  45.  */
  46.     /* 
  47.      * Datas: 
  48.      */
  49.     extern    int    count_pages( DATADIR *datadir );
  50.     /* 
  51.      * Traitement des objets AES: 
  52.      */
  53.     extern    void    rsrc_color( OBJECT *tree );
  54.     extern    GRECT    * objc_xywh ( OBJECT *tree, int objc, GRECT *frame );
  55.     extern    char    *strBchr( char *string, char chr );  /* Sp‚cial FP */
  56.     extern    char    *extract_fmtFtext( OBJECT *tree, int obj );
  57.     extern    void    fix_fmtFtext( OBJECT *tree, int obj, const char    *ftext );
  58.     extern    void    maptree( OBJECT *tree, int this, int last, int (*routine)( OBJECT *tree, int tmp1 ) );
  59.     extern    void    objc_dsel( OBJECT *tree, int obj );
  60.     extern    void    objc_clrsel(  OBJECT *tree, int obj );
  61.     extern    void    objc_setsel(  OBJECT *tree, int obj );
  62.     extern    void    open_dialog( OBJECT *dialog, const GRECT *little_box, GRECT *big_box );
  63.     extern    void    close_dialog( OBJECT *dialog, int exit_obj, const GRECT *little_box, const GRECT *big_box );
  64.     extern    GRECT    * objc_xywh ( OBJECT *tree, int objc, GRECT *frame );
  65.     extern    dlink_teptext ( OBJECT *objc_adr, const char *texte );
  66.     extern    rlink_teptext ( OBJECT *objc_adr, const char *texte );
  67.     /* 
  68.      * Form_do: 
  69.      */
  70.     extern    int    ext_form_do( OBJECT *tree, int *startfield );
  71.     extern    void    extform_lastmpos( int *mx, int *my );
  72.     /* 
  73.      * Sp‚cial: 
  74.      */
  75.     extern    void    ping ( void );
  76.     extern    int    min( int a, int b );
  77.     extern    int    max( int a, int b );
  78.     /* 
  79.      * G‚n‚ral: 
  80.      */
  81.     extern    void erreur_rsrc( void );
  82.  
  83.  
  84.  
  85. /*
  86.  * PRIVate INTernal prototypes:
  87.  */
  88.     static int    ramselect_actions( LISTHANDLES *list_handles, int    obj );
  89.     static void    ramsel_fixstate_act(                    /* Out: Rien */
  90.                 LISTHANDLES *list_handles );    /* In: Ptr sur infos sur la liste & le dialogue affich‚s */
  91.  
  92.     static void    fix_pos_asc( LISTHANDLES *list_handles, long scsr_range, int top_item, int top_range );
  93.     static void    redraw_list( LISTHANDLES *list_handles );
  94.     static int    reperes_sel( OBJECT *form_tree, int obj );
  95.     static void    fixe_liste( LISTHANDLES *list_handles, int first_page, int first_line, int nb_lines );
  96.     static void    enable_list( LISTHANDLES *list_handles, int used_lines );
  97.     static void move_selected_line(                     /* Out: Rien */
  98.             LISTHANDLES *list_handles,        /* In: Ptr sur infos sur la liste & le dialogue affich‚s */
  99.             int    move );                        /* In: D‚placement en nbre de lignes */
  100.  
  101.  
  102.  
  103. /*
  104.  * ------------------------ VARIABLES -------------------------
  105.  */
  106.     
  107. /*
  108.  * Private variables: 
  109.  */
  110.     static    OBJECT        *M_ramselect_adr;    /* Ptr sur s‚lecteur des fichiers en RAM */
  111.     static    LISTHANDLES    M_maptree_vars;    /* Variables globales pour MAPTREE */
  112.     static    int            M_init_text;        /* Initialisation du texte en cours? */
  113.      
  114. /*
  115.  * ------------------------ FUNCTIONS -------------------------
  116.  */
  117.  
  118.  
  119. /*
  120.  * --------------- SELECTION D'OBJETS EN RAM ---------------
  121.  */
  122.  
  123.  
  124.  
  125. /*
  126.  * init_ramselect(-)
  127.  *
  128.  * Purpose:
  129.  * --------
  130.  * Init du selecteur d'objets en RAM
  131.  *
  132.  * History:
  133.  * --------
  134.  * 1993: fplanque: Created
  135.  */
  136. void    init_ramselect( void )
  137. {
  138.     if (rsrc_gaddr( R_TREE, RAMSELEC, &M_ramselect_adr) == 0)
  139.         erreur_rsrc();
  140.  
  141.     rsrc_color( M_ramselect_adr );        /* Fixe couleurs */
  142.  
  143. }
  144.  
  145. /*
  146.  * ramselect_fromForm(-)
  147.  *
  148.  * Purpose:
  149.  * --------
  150.  * S‚lection d'un "OBJET" en RAM
  151.  * depuis un autre formulaire
  152.  *
  153.  * Algorythm:
  154.  * ----------  
  155.  * s'occupe en particulier de r‚afficher le formulaire du dessous
  156.  *
  157.  * History:
  158.  * --------
  159.  * 01.09.94: fplanque: Created
  160.  */
  161. RAMSEL ramselect_fromForm(         /* Out:    r‚sultat de la s‚lection: RAMSEL_ABORT, RAMSEL_PATH ou RAMSEL_FILE */
  162.             char          *    sel_titre,     /* In:     S‚lection du titre */
  163.             DATAGROUP *    datagroup,     /* In:     DataGroup dans lequel on effectue la s‚lection */
  164.             char         **    sel_page,     /* Out:    Adresse du TAMPON ds lequel se trouve le path du fichier s‚lectionn‚ */
  165.             OBJECT      *    arbre_fond, /* In:    Dialogue depuis lequel on appelle le s‚lecteur de fichiers */
  166.             int            call_obj )    /* In:    No de l'objet qui a appell‚ le s‚lecteur depuis le dialogue de fond */
  167. {
  168.     GRECT        start_box, form_box;
  169.     RAMSEL    resultat;
  170.     
  171.     /*
  172.      * Coord de d‚part du grow_box= 
  173.      */
  174.     objc_xywh( arbre_fond, call_obj, &start_box );
  175.  
  176.     /*
  177.      * Appel s‚lecteur:
  178.      */
  179.     resultat = ramselect( sel_titre, datagroup -> root_dir , sel_page, &start_box, &form_box );
  180.     
  181.     /* 
  182.      *    Red‚ssinne le fond: 
  183.      */
  184.     objc_draw( arbre_fond, 0, 5, form_box .g_x, form_box .g_y, form_box .g_w, form_box .g_h );
  185.  
  186.     /*
  187.      * Retourne info sur s‚lection 
  188.      */
  189.     return     resultat;            /* =0 si on a annul‚ */
  190.     
  191. }
  192.  
  193.  
  194.  
  195. /*
  196.  * ramselect(-)
  197.  *
  198.  * Purpose:
  199.  * --------
  200.  * S‚lection d'un "OBJET" en RAM
  201.  * Un peu … la maniŠre de STUT ONE version 2
  202.  *
  203.  * History:
  204.  * --------
  205.  * 1993: fplanque: Created
  206.  * 04.01.94: nouveau format d'appel de select_in_list()
  207.  * 01.09.94: introduction des constantes RAMSEL_...
  208.  * 02.09.94: la s‚lection se fait maintenant dans un DATADIR!
  209.  */
  210. RAMSEL ramselect(                         /* Out:    r‚sultat de la s‚lection: RAMSEL_ABORT, RAMSEL_PATH ou RAMSEL_FILE */
  211.             char          *    sel_titre,         /* In:     S‚lection du titre */
  212.             DATADIR     * pDataDir,        /* In:    Datadir ds lequel on effectue la s‚lection */
  213.             char         **    sel_page,         /* Out:    Adresse du TAMPON ds lequel se trouve le path du fichier s‚lectionn‚ */
  214.             GRECT         * pGRect_start,    /* In:     D‚but ouverture */
  215.             GRECT         * pGRect_form)    /* Out:    copie ds ce GRect les coords du s‚lecteur */
  216. {
  217.     /*
  218.      * DataGroup dans lequel on effectue la s‚lection 
  219.      */
  220.     DATAGROUP *    pDataGroup = pDataDir -> pDataGroup;
  221.  
  222.     int            i,nb_pages;
  223.     char            * *name_array;        /* Tableau contenant les noms des pages */
  224.     DATAPAGE        *page_ptr;
  225.         
  226.     /*
  227.      * Variables d'‚dition: 
  228.      */
  229.     static int    esc_objs[]={ RSELVALI, RSELANNU, NIL };
  230.     char        *sel_sel = (M_ramselect_adr[ RSELSEL ] .ob_spec.tedinfo) -> te_ptext;
  231.     int        exit_obj;
  232.     /*
  233.      * Pas de s‚lection pour l'instant:
  234.      */
  235.     RAMSEL    resultat = RAMSEL_ABORT;    
  236.     /*
  237.      * Tampon de path, dont l'adresse sera aussi renvoy‚e … l'appellant: 
  238.      */
  239.     static char        sel_path[ RAMPATH_MAXLEN ];    /* Longueur pour 10 dossiers + nom de fichier */
  240.     
  241.     /*
  242.      * Init titre: 
  243.      */
  244.     dlink_teptext( &M_ramselect_adr[ RSELTITR ], sel_titre );    /* Titre du s‚lecteur */
  245.     /*
  246.      * Init s‚lection: 
  247.      */
  248.     *sel_sel = '\0';
  249.     /*
  250.      * Init path de s‚lection: 
  251.      */
  252.     strcpy( sel_path, pDataGroup -> data_device );    /* Copie par exemple "ARB:" */
  253.     strcat( sel_path, "\\*.*" );                            /* Rajoute masque de s‚lection */
  254.     rlink_teptext ( &M_ramselect_adr[ RSELPATH ], sel_path );    /* Place ds formulaire */
  255.     *sel_page = sel_path;    /* La fonction appellante aura ainsi accŠs … ce tampon */        
  256.  
  257.     /*
  258.      * Cr‚ation de la liste (fonctions & chemins d'accŠs): 
  259.      * Compte pages: 
  260.      */
  261.     nb_pages = count_pages( pDataDir );
  262.     /*
  263.      * Cr‚e zones de stockage: 
  264.      */
  265.     if ( nb_pages )
  266.     {    /*
  267.           * S'il y a des pages: 
  268.          * Cr‚e zone: 
  269.          */
  270.         name_array = (char * *) MALLOC( sizeof( char* ) * nb_pages );
  271.         /*
  272.          * Remplit tableau: 
  273.          */
  274.         page_ptr = pDataDir -> data_start;    /* Adr 1Šre page */
  275.         for ( i=0; i<nb_pages; i++ )
  276.         {
  277.             name_array[ i ] = page_ptr -> nom;
  278.             page_ptr = page_ptr -> next;    /* Passe sur la page suivante */
  279.         }
  280.     }
  281.     else
  282.     {    /*
  283.          * Si aucune page: 
  284.          */
  285.         name_array = NULL;
  286.     }
  287.     
  288.     /* 
  289.      * Gestion formulaire: 
  290.      */
  291.     exit_obj = select_in_list( 
  292.                         M_ramselect_adr, 
  293.                         pGRect_start, 
  294.                         pGRect_form,
  295.                         &name_array, 
  296.                         &nb_pages,
  297.                         esc_objs, 
  298.                         ramselect_actions, 
  299.                         ramsel_fixstate_act,
  300.                         RSELSEL);
  301.                         
  302.     /*
  303.      * LibŠre listes: 
  304.      */
  305.     if( name_array != NULL );
  306.     {
  307.         FREE( name_array );
  308.     }
  309.         
  310.     if ( exit_obj == RSELVALI )
  311.     {    /*
  312.          * Si on a valid‚: 
  313.          * Il faut copier le nom du fichier s‚lectionn‚ … la fin du path: 
  314.          */
  315.         char    *path_end = strBchr( sel_path, '\\' );    /* Cherche dernier Backslash */
  316.         char    *file_name = extract_fmtFtext( M_ramselect_adr, RSELSEL ); /* Nom du fichier */
  317.  
  318.         strcpy( path_end +1, file_name );    /* Ecrase fin du path (style "*.*") par le nom du fichier s‚lectionn‚ */
  319.  
  320.         /*
  321.          * Teste si on a s‚lectionn‚ un fichier: 
  322.          */
  323.         if( strlen( file_name ) )
  324.         {
  325.             resultat = RAMSEL_FILE;        /* Oui */
  326.         }
  327.         else
  328.         {
  329.             resultat    = RAMSEL_PATH;        /* Non, mais on a qd mˆme s‚lectionn‚ un chemin d'accŠs */
  330.         }
  331.         FREE( file_name );                /* C'‚tait une chaine temporaire */
  332.                             
  333.     }
  334.  
  335.     /*
  336.      * Retourne info sur s‚lection 
  337.      */
  338.     return     resultat;            /* =0 si on a annul‚ */
  339. }
  340.  
  341.  
  342. /*
  343.  * ramselect_actions(-)
  344.  *
  345.  * Purpose:
  346.  * --------
  347.  * Traitement des objets exit du formulaire-s‚lecteur d'objets pr‚c‚dent
  348.  *
  349.  * Suggest:**
  350.  * --------
  351.  * Au niveau de l'int‚grit‚ fonctionnelle: il serait judicieux
  352.  * de mettre le traitement du clic sur un elt de la liste dans une
  353.  * fonctions appell‚e directement par select_in_list()
  354.  * ici on traite avant tout les boutons d'ACTION
  355.  *
  356.  * History:
  357.  * --------
  358.  * 1993: fplanque: Created
  359.  */
  360. int    ramselect_actions( 
  361.             LISTHANDLES *    list_handles, 
  362.             int                 obj )
  363. {
  364.     if( obj & SEL_LINE )
  365.     {    /*
  366.          * Si on a cliqu‚ sur un nom 
  367.          */
  368.         GRECT        box;
  369.         unsigned    u_DblClick = obj & DBLE_CLICLK;
  370.         obj &= SEL_OBJC_NO;        /* EnlŠve bits 14 et 15 */
  371.  
  372.         /*
  373.          * Copie chaine: 
  374.          */
  375.         fix_fmtFtext( M_ramselect_adr, RSELSEL, (M_ramselect_adr[ obj ] .ob_spec.tedinfo) -> te_ptext );
  376.  
  377.         /*
  378.          * R‚affiche: 
  379.          */
  380.         objc_xywh( M_ramselect_adr, RSELSEL, &box );
  381.         objc_draw( M_ramselect_adr, RSELSEL, 1, box .g_x, box .g_y, box .g_w, box .g_h );
  382.  
  383.         if( u_DblClick )
  384.         {    /*
  385.             * Si on a double cliqu‚ sur un nom:
  386.              * Il faut signaler que c'est une confirmation
  387.              */
  388.             return    RSELVALI;    /* met fin au dialogue: confirmation */
  389.         }
  390.     }
  391.     else
  392.     {
  393.         switch( obj )
  394.         {
  395.             case    RSELVALI:
  396.             case    RSELANNU:
  397.                 return    obj;    /* Met fin au dialogue */
  398.                 
  399.             default:
  400.             
  401.                 FAKE_USE( list_handles );
  402.             
  403.                 ping();
  404.         }
  405.     }
  406.     
  407.     
  408.     return    TRUE_1;            /* Continue le dialogue */
  409. }
  410.  
  411.  
  412. /*
  413.  * ramsel_fixstate_act(-)
  414.  *
  415.  * Purpose:
  416.  * --------
  417.  * Ne fait rien, mais il nous faut l'adresse de cette func 
  418.  * lors du transfert de paramŠtres vers select_in_list()
  419.  * Cette fonction POURRAIT servir … allumer/eteindre les boutons d'action
  420.  * du selecteur RAM s'il y en avait (genre "INFO sur l'objet s‚lectionn‚)
  421.  *
  422.  * History:
  423.  * --------
  424.  * 04.01.94: fplanque: Created
  425.  */
  426. void    ramsel_fixstate_act(                    /* Out: Rien */
  427.             LISTHANDLES *list_handles )    /* In: Ptr sur infos sur la liste & le dialogue affich‚s */
  428. {
  429.     FAKE_USE( list_handles -> form_tree );     
  430. }
  431.  
  432.  
  433. /*
  434.  * --------------- SELECTION D'OBJETS DANS UNE LISTE ---------------
  435.  */
  436.  
  437.  
  438.  
  439. /*
  440.  * select_in_list(-)
  441.  *
  442.  * Purpose:
  443.  * --------
  444.  * Gestion d'un formulaire de s‚lection/action
  445.  * pr‚sentant une liste textuelle dot‚e d'un ascensceur de d‚filement
  446.  *
  447.  * Notes:
  448.  * ------
  449.  * Il y a deux listes parallŠles:
  450.  *  - "fnct": non s‚lectionnables (juste informatifs)
  451.  *  - "path": s‚lectionnables -> activant les boutons d'action
  452.  *
  453.  * Suggest:
  454.  * --------
  455.  * -esc_objs: ces objets pourraient ˆtre trouv‚s automatiquement par un
  456.  * walk tree de la mˆme maniŠre que les elements constituants et
  457.  * manipulateurs de la liste.
  458.  * 04.01.94: v‚rifier si la variables selected_line en LOCAL duplicata
  459.  * de la var ds list_handles est bien utile... et rentable.
  460.  *
  461.  * History:
  462.  * --------
  463.  * 1993: fplanque: Created
  464.  * 04.01.94: Modif des actions … effectuer lors du click sur une ligne de la liste
  465.  * 04.01.94: M‚mo d'un ptr sur fixstat_act() afin de pouvoir ‚teindre les boutons d'actions depuis move_selected_line()
  466.  * 05.01.94: nb_items est d‚sormais re‡u par adresse: on renvoie ainsi le nouveau nbre de lignes de la liste si elle a ‚t‚ modifi‚e
  467.  * 04.12.94: ne gŠre plus qu'une seule liste
  468.  * 07.01.95: gŠre les doubles clicks; allumage des boutons d'action aprŠs changement liste
  469.  */
  470. int    select_in_list( 
  471.             OBJECT         *    form_tree,         /* In: Arbre d'obj: boite de dialogue … afficher */
  472.             const GRECT *    start_box,         /* In: Coord d‚part de l'effet graphique d'ouverture/fermeture */
  473.             GRECT         *    form_box,         /* Out: Coord boite de dialog … l'‚cran */
  474.             char         * * *    path_array,     /* In/Out: Adr d'un ptr sur table "path" */
  475.             int             *    nb_items,        /* In: Nbre d'‚l‚ments de la liste */
  476.             int             *    esc_objs,         /* In: Ptr sur tableau contenant la
  477.                                                      * liste des bouton d'action: ttmnt sp‚cial 
  478.                                                      */
  479.             int (*actions)(LISTHANDLES *list_handles, int obj),
  480.                                                     /* In: Ptr sur fonction … appeler 
  481.                                                      * pour traiter les boutons d'action
  482.                                                      */
  483.             void (*fixstate_act)(LISTHANDLES *list_handles),
  484.                                                     /* In: Ptr sur fonction … appeler
  485.                                                      * pour allumer/eteindre les boutons d'action
  486.                                                      */
  487.             int edit_obj )                        /* In: Obj sur leql se situe le csr en d‚but d'‚dition */
  488. {
  489.     /* 
  490.      * Variables concernant le dialogue: 
  491.      */
  492.     LISTHANDLES    list_handles;            /* Objets de manipulation de la liste */
  493.     int        nb_elts = *nb_items;        /* Nbre d'‚lements total de la liste */
  494.     int        nb_lines;                    /* Nombre de lignes du s‚lecteur */
  495.     int        used_lines;                    /* Nombre de lignes utilis‚es */
  496.     int        exit_obj;                    /* Objet de sortie */
  497.     int        continuer = TRUE_1;            /* A priori, on continue le dialogue */
  498.     int        i, obj;                        /* Objet trait‚ */
  499.     int        selected_line = NIL;        /* Ligne s‚lectionn‚e en ce moment */
  500.     int        sbar_height;                /* Taille cage d'ascenseur */
  501.     int        scsr_height;                /* Taille curseur d'acscenseur */
  502.     long        scsr_range;                    /* Latitude de mouvement de l'asc */
  503.                                                 /* Long pour forcer les calculs sans perte */
  504.     int        top_item = 0;                /* Element du haut */
  505.     int        top_range;                    /* Latitude de mouvement de l'objet du haut */
  506.     unsigned    u_DblClick;
  507.  
  508.     /* 
  509.      * Initialisation de l'arbre: 
  510.      */
  511.     M_init_text = FALSE0;            /* On est pas en train d'initialiser */
  512.     maptree( form_tree, ROOT, NIL, reperes_sel );
  513.  
  514.  
  515.     /* 
  516.      * Sauve variables globales en locales pour autoriser la r‚cursivit‚: 
  517.      */
  518.     list_handles = M_maptree_vars;
  519.     /* 
  520.      * Les variables suivantes sont ajout‚es pour r‚duire 
  521.      * le nombre de paramŠtres … transmettre aux fonctions 
  522.      */
  523.     list_handles .form_tree = form_tree;    /* Ajoute adr de l'arbre d'objets */
  524.     list_handles .pTpsz_array = path_array;    /* Ajoute adr du ptr sur tabl noms */
  525.     list_handles .nb_items = nb_elts;        /* Nbre d'elts de la liste */
  526.     list_handles .fixstate_act = fixstate_act;    /* Ptr sur func qui fixe ‚tat des boutons d'actions */
  527.  
  528.     /* 
  529.      * Calculs: 
  530.      */
  531.     nb_lines = list_handles .last_name - list_handles .first_name +1;    /* Nbre de lignes dispo ds le s‚lecteur */
  532.     used_lines = min(    nb_lines, nb_elts );    /* Nre de lignes r‚ellement utilis‚es */
  533.     top_range = nb_elts - used_lines;            /* Lattitude de mvt du haut de la liste */
  534.  
  535.  
  536.     /*
  537.      * Init liste: 
  538.      */
  539.     fixe_liste( &list_handles, top_item, 0, used_lines );
  540.     enable_list( &list_handles, used_lines );        /* Disable des lignes vides */
  541.  
  542.         
  543.      /* 
  544.       * Taille ascenseur: 
  545.       */
  546.     sbar_height = form_tree[ list_handles .slide_bar ] .ob_height;
  547.     if    ( nb_elts > nb_lines )        /* Si tous les elts ne peuvent ˆtre affich‚s simultan‚ment */
  548.     {    /* 
  549.          * Calcule dimension asc en imposant une hauteur minimale de 1 caractŠre 
  550.          */
  551.         scsr_height = max( G_std_text .cell_h, sbar_height * nb_lines / nb_elts);
  552.     }
  553.     else
  554.     {    /* Si moins d'elts que de lignes: */
  555.         scsr_height = sbar_height;
  556.     }
  557.     form_tree[ list_handles .slide_csr ] .ob_height = scsr_height;    /* Fix taille asc */
  558.     /*
  559.      * Latitude de mouvement de l'ascenseur: 
  560.      */
  561.     scsr_range = sbar_height - scsr_height;
  562.     /*
  563.      * Position ascenseur: 
  564.      */
  565.     fix_pos_asc( &list_handles, scsr_range, top_item, top_range );
  566.     
  567.     
  568.     /*
  569.      * Gestion formulaire: 
  570.      * vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
  571.      */
  572.     open_dialog( form_tree, start_box, form_box );
  573.     graf_mouse( ARROW, 0);                    /* souris: FlŠche */
  574.  
  575.     for( ; ; )
  576.     {    /*
  577.          * Mise … jour de certaines variables dans la liste des paramŠtres: 
  578.          */
  579.         list_handles .top_item         = top_item;        /* No de la 1Šre ligne affich‚e */
  580.         list_handles .selected_line = selected_line;    /* No de la ligne s‚lectionn‚e */
  581.  
  582.         /*
  583.          * Gestion form jusqu'… un clic sur objet exit 
  584.          */
  585.         exit_obj    =    ext_form_do( form_tree, &edit_obj );    /* Gestion de la boŒte */
  586.  
  587.         u_DblClick = exit_obj & 0x8000;
  588.         exit_obj     &= 0x7FFF;        /* Masque bit 15 (Double-clic) */
  589.  
  590.         /*
  591.          * Gestion des boutons sp‚cifiques: 
  592.          */
  593.         if( exit_obj == list_handles .arrow_up )
  594.         {    /*************/
  595.             /* Arrow UP: */
  596.             /*************/
  597.             if ( top_item > 0 )
  598.             {    /*
  599.                  * Si on est pas encore au plus haut! 
  600.                  * Monte d'un cran et fix ascenseur: 
  601.                  */
  602.                 fix_pos_asc( &list_handles, scsr_range, (--top_item), top_range );
  603.                 /*
  604.                  * Descend la ligne s‚lectionn‚e: 
  605.                  */
  606.                 move_selected_line( &list_handles, +1 );
  607.                 selected_line = list_handles .selected_line;
  608.                 /*
  609.                  * Fixe nlle liste 
  610.                  */
  611.                 fixe_liste( &list_handles, top_item, 0, used_lines );
  612.                 /*
  613.                  * Red‚ssine zone: 
  614.                  */
  615.                 redraw_list( &list_handles );
  616.             }
  617.         }
  618.         else if( exit_obj == list_handles .arrow_down )
  619.         {    /***************/
  620.             /* Arrow DOWN: */
  621.             /***************/
  622.             if ( top_item < top_range )
  623.             {    /*
  624.                  * Si on est pas encore au plus bas! 
  625.                  * Descend d'un cran et fix ascenseur: 
  626.                  */
  627.                 fix_pos_asc( &list_handles, scsr_range, (++top_item), top_range );
  628.                 /*
  629.                  * Monte la ligne s‚lectionn‚e: 
  630.                  */
  631.                 move_selected_line( &list_handles, -1 );
  632.                 selected_line = list_handles .selected_line;
  633.                 /*
  634.                  * Fixe nlle liste 
  635.                  */
  636.                 fixe_liste( &list_handles, top_item, 0, used_lines );
  637.                 /*
  638.                  * Red‚ssine zone: 
  639.                  */
  640.                 redraw_list( &list_handles );
  641.             }
  642.         }
  643.         else if( exit_obj == list_handles .slide_bar )
  644.         {    /*****************/
  645.             /* Page UP/DOWN: */
  646.             /*****************/
  647.             int    click_x, click_y;
  648.             int    slide_x, slide_y;
  649.             int    new_top_item;
  650.         
  651.             /* Trouve coordonn‚es: */
  652.             extform_lastmpos( &click_x, &click_y );    /* Click */
  653.             objc_offset( form_tree, list_handles .slide_csr, &slide_x, &slide_y );    /* Ascenseur */
  654.             /*
  655.              * Selon qu'on a cliqu‚ au dessus ou au dessous de l'asc: 
  656.              */
  657.             if ( click_y < slide_y )
  658.             {    /************/
  659.                 /* Page UP: */
  660.                 /************/
  661.                 if ( top_item > 0 )
  662.                 {    /* Si on est pas encore au plus haut! */
  663.                 /* Monte d'un cran et fix ascenseur: */
  664.                     new_top_item = max( 0, top_item - nb_lines );
  665.                     fix_pos_asc( &list_handles, scsr_range, new_top_item, top_range );
  666.                 /* Descend la ligne s‚lectionn‚e: */
  667.                     move_selected_line( &list_handles, top_item - new_top_item );
  668.                     selected_line = list_handles .selected_line;
  669.                 /* Fixe nlle liste */
  670.                     top_item = new_top_item;
  671.                     fixe_liste( &list_handles, top_item, 0, used_lines );
  672.                 /* Red‚ssine zone: */
  673.                     redraw_list( &list_handles );
  674.                 }
  675.             }
  676.             else
  677.             {    /**************/
  678.                 /* Page DOWN: */
  679.                 /**************/
  680.                 if ( top_item < top_range )
  681.                 {    /* Si on est pas encore au plus bas: */
  682.                 /* Monte d'un cran et fix ascenseur: */
  683.                     new_top_item = min( top_range, top_item + nb_lines );
  684.                     fix_pos_asc( &list_handles, scsr_range, new_top_item, top_range );
  685.                 /* Monte la ligne s‚lectionn‚e: */
  686.                     move_selected_line( &list_handles, top_item - new_top_item );
  687.                     selected_line = list_handles .selected_line;
  688.                 /* Fixe nlle liste */
  689.                     top_item = new_top_item;
  690.                     fixe_liste( &list_handles, top_item, 0, used_lines );
  691.                 /* Red‚ssine zone: */
  692.                     redraw_list( &list_handles );
  693.                 }
  694.             }
  695.         }
  696.         else if( exit_obj == list_handles .slide_csr )
  697.         {    /***********/
  698.             /* SLIDER: */
  699.             /***********/
  700.             int    new_pos;
  701.         
  702.             /* Mouvement fant“me: */
  703.             new_pos = graf_slidebox( form_tree, list_handles .slide_bar,
  704.                                list_handles .slide_csr, 1 );
  705.  
  706.             /* Calcule position demand‚e: */
  707.             /*    printf("Pos dem=%d ",new_pos); */
  708.             new_pos = (int)( (long)new_pos * top_range /1000 );
  709.             /* printf("Pos calc=%d \r",new_pos); */
  710.  
  711.             /* Contr“le si position a chang‚: */
  712.             if ( new_pos != top_item )
  713.             {    /*
  714.                  * Si pos … chang‚: 
  715.                  */
  716.  
  717.                 /* Fixe ascenseur: */
  718.                 fix_pos_asc( &list_handles, scsr_range, new_pos, top_range );
  719.                 /* Monte ou Descend la ligne s‚lectionn‚e: */
  720.                 move_selected_line( &list_handles, top_item - new_pos );
  721.                 selected_line = list_handles .selected_line;
  722.                 /* Fixe nlle liste */
  723.                 top_item = new_pos;
  724.                 fixe_liste( &list_handles, top_item, 0, used_lines );
  725.                 /* Red‚ssine zone: */
  726.                 redraw_list( &list_handles );
  727.             }
  728.       }
  729.         else
  730.         {
  731.             if( exit_obj >= list_handles .first_name && exit_obj <= list_handles .last_name )
  732.             {    /*
  733.                  ****************************
  734.                  * Si on a cliqu‚ sur un nom:
  735.                  ****************************
  736.                  * Contr“le que le nom n'est pas DISABLED: 
  737.                  */
  738.                 if ( !(form_tree[ exit_obj ] .ob_state & DISABLED) )
  739.                 {    /* 
  740.                      * Fixe nlle ligne s‚lectionn‚e 
  741.                      * en local et ds la structure list_handles afin d'informer 
  742.                      * l'ext‚rieur (utile lors de l'appell … fixstate_act() )
  743.                      */
  744.                     selected_line = exit_obj;            
  745.                     list_handles .selected_line = selected_line;    
  746.  
  747.                     /*
  748.                      * 04.01.94: S'occupe d'allumer les boutons d'actions:
  749.                      */
  750.                     fixstate_act( &list_handles );    
  751.  
  752.                     /* 
  753.                      * On remet le bit 15 si double click
  754.                      * On met le bit 14 pour signaler qu'on a cliqu‚ sur un nom
  755.                      */
  756.                     continuer = actions( &list_handles, exit_obj | u_DblClick | 0x4000 ); /* Routine de traitement */
  757.                     if( continuer < FALSE0 )
  758.                     {                        
  759.                         graf_mouse( ARROW, 0);            /* souris: FlŠche */
  760.                         continue;    /* Retourne directement en gestion formulaire! */
  761.                     }
  762.                 }
  763.                 else
  764.                 {    /* Si l'objet est DISABLED: */
  765.                     continue;    /* On ignore le clic */
  766.                 }
  767.             }
  768.             else
  769.             {    /*
  770.                  * On a pas cliqu‚ sur un nom:
  771.                  * Teste si l'action doit ˆtre trait‚e par une routine sp‚ciale: 
  772.                  */
  773.                 i=0;
  774.                 do
  775.                 {    /*
  776.                      * Parcourt la liste des boutons n‚cessitant un traitement sp‚cial: 
  777.                      */
  778.                     obj = esc_objs[ i++ ];
  779.                     if( exit_obj == obj )
  780.                     {    /*
  781.                          * Si l'action doit ˆtre trait‚e par rout sp‚ciale: 
  782.                          */
  783.                         continuer = actions( &list_handles, obj ); /* Routine de traitement */
  784.                     
  785.                         /*
  786.                          * Teste si on a modifi‚ la liste: 
  787.                          */
  788.                         if ( continuer == CHANGE_2 )
  789.                         {    /*
  790.                               * ---------------------- 
  791.                              * On a modifi‚ la liste:
  792.                              * ----------------------
  793.                              * Calculs: 
  794.                              */        
  795.                             nb_elts = list_handles .nb_items;            /* Nbre d'elts ds la liste */
  796.                             used_lines = min(    nb_lines, nb_elts );        /* Nre de lignes r‚ellement utilis‚es */
  797.                             top_range = nb_elts - used_lines;            /* Lattitude de mvt du haut de la liste */
  798.  
  799.                             /*
  800.                              * Init liste: 
  801.                              */
  802.                             top_item = list_handles .top_item;            /* Nlle ligne du haut */
  803.                             fixe_liste( &list_handles, top_item, 0, used_lines );
  804.                             enable_list( &list_handles, used_lines );        /* Disable des lignes vides */
  805.  
  806.                             /*
  807.                              * Ligne s‚lectionn‚e: 
  808.                              */
  809.                             selected_line = list_handles .selected_line;
  810.                             if ( selected_line != NIL )
  811.                             {    /*
  812.                                  * S'il y a une ligne s‚lectionn‚e 
  813.                                  */
  814.                                 objc_setsel( form_tree, selected_line );    /* S‚lectionne nouvelle ligne */
  815.                             }
  816.  
  817.                             /*
  818.                              * Taille ascenseur: 
  819.                              */
  820.                             if    ( nb_elts > nb_lines )        /* Si tous les elts ne peuvent ˆtre affich‚s simultan‚ment */
  821.                             {    /* Calcule dimension asc en imposant une hauteur minimale de 1 caractŠre */
  822.                                 scsr_height = max( G_std_text .cell_h, sbar_height * nb_lines / nb_elts);
  823.                             }
  824.                             else
  825.                             {    /* Si moins d'elts que de lignes: */
  826.                                 scsr_height = sbar_height;
  827.                             }
  828.                             form_tree[ list_handles .slide_csr ] .ob_height = scsr_height;    /* Fix taille asc */
  829.                             /*
  830.                              * Latitude de mouvement de l'ascenseur: 
  831.                              */
  832.                             scsr_range = sbar_height - scsr_height;
  833.                             /*
  834.                              * Position ascenseur: 
  835.                              */
  836.                             fix_pos_asc( &list_handles, scsr_range, top_item, top_range );
  837.                         
  838.                             /*
  839.                              * Red‚ssine zone liste + ascensceur: 
  840.                              */
  841.                             redraw_list( &list_handles );
  842.                                                     
  843.                             /*
  844.                              * Allume les boutons d'action si n‚cessaire:
  845.                              */
  846.                             fixstate_act( &list_handles );    
  847.  
  848.                         }
  849.  
  850.                         graf_mouse( ARROW, 0);            /* souris: FlŠche */
  851.                         break;                                /* Pas besoin de tester les autres objs */
  852.                     }
  853.                 } while( obj != 0 );
  854.             }
  855.         }
  856.             
  857.         /*
  858.          * Sortie si n‚cessaire: 
  859.          */
  860.         if( continuer >= FALSE0 )
  861.         {    /* Si on abandonne le formulaire: */
  862.             break;
  863.         }
  864.                             
  865.         /*
  866.          * D‚s‚lection du bouton s‚lectionn‚: 
  867.          */
  868.         objc_dsel( form_tree, exit_obj );
  869.     }
  870.  
  871.     graf_mouse( BUSYBEE, 0);                /* souris: Abeille */
  872.     close_dialog( form_tree, exit_obj, start_box, form_box );
  873.     /* 
  874.      * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  875.      */
  876.  
  877.     /* 
  878.      * D‚s‚lectionne les objets: 
  879.      */
  880.     objc_clrsel( form_tree, exit_obj );    /* D‚s‚lectionne bouton de sortie */
  881.     if( selected_line != NIL )
  882.     {
  883.         objc_clrsel( form_tree, selected_line );    /* D‚s‚lectionne ligne courament s‚lectionn‚e */
  884.     }
  885.  
  886.     /*
  887.      *    Retourne … l'appellant le nouveau nbre d'elts de la liste
  888.      * au cas o— la liste a chang‚ de taille
  889.      */
  890.     *nb_items = nb_elts;
  891.  
  892.     /* 
  893.      * Retourne le num‚ro de l'objet qui a fait quitter: 
  894.      */
  895.     if( continuer > 0 )
  896.     {
  897.         return    continuer;
  898.     }
  899.     
  900.     return    exit_obj;
  901.  
  902. }
  903.  
  904.  
  905. /*
  906.  * fix_pos_asc(-)
  907.  *
  908.  * Purpose:
  909.  * --------
  910.  * Fixe la position de l'ascenseur 
  911.  * d'un s‚lecteur trait‚ par select_in_list()
  912.  *
  913.  * History:
  914.  * --------
  915.  * 1993: fplanque: Created
  916.  */
  917. void    fix_pos_asc( 
  918.             LISTHANDLES *list_handles, 
  919.             long scsr_range, 
  920.             int top_item, 
  921.             int top_range )
  922. {
  923.     OBJECT    *form_tree = list_handles -> form_tree;
  924.     int        slide_csr  = list_handles -> slide_csr;
  925.  
  926.     if ( top_range )
  927.     {    /* Si l'ascenseur peut bouger!: */
  928.         form_tree[ slide_csr ] .ob_y = (int)(scsr_range * top_item / top_range);
  929.     }
  930.     else
  931.         form_tree[ slide_csr ] .ob_y = 0;
  932. }
  933.  
  934.  
  935.  
  936. /*
  937.  * move_selected_line(-)
  938.  *
  939.  * Purpose:
  940.  * --------
  941.  * D‚place la ligne courament s‚lectionn‚e
  942.  * dans une liste trait‚e par select_in_list()
  943.  *
  944.  * Algorythm:
  945.  * ----------  
  946.  * - V‚rifie qu'il y avait d‚j… un ligne s‚lectionn‚e (sinon ya rien … faire)
  947.  * - D‚s‚lectionne ligne physique
  948.  * - Calcule nouvelle pos de la ligne
  949.  * - Si elle sort de l'‚cran: eteinds les actions qui s'y report‚e
  950.  *   Sinon: r‚affiche … nouvelle pos
  951.  * - M‚morise new ligne s‚lect ou NIL si sortie
  952.  *
  953.  * History:
  954.  * --------
  955.  * 1993: fplanque: Created
  956.  * 04.01.94: Extinction des actions devenues invalides suite … sortie de la ligne s‚lectionn‚ des limites de l'‚cran
  957.  */
  958. void    move_selected_line(                     /* Out: Rien */
  959.             LISTHANDLES *list_handles,        /* In: Ptr sur infos sur la liste & le dialogue affich‚s */
  960.             int    move )                        /* In: D‚placement en nbre de lignes */
  961. {
  962.     OBJECT    *form_tree = list_handles -> form_tree;
  963.  
  964.     if ( list_handles -> selected_line != NIL )
  965.     {    /*    
  966.          * S'il y avait d‚j… une ligne de s‚lectionn‚e:
  967.          */
  968.     
  969.         /* 
  970.          * D‚s‚lectionne ligne courament s‚lectionn‚e:
  971.          */
  972.         objc_clrsel( form_tree, list_handles -> selected_line );    
  973.  
  974.         list_handles -> selected_line += move;
  975.         if (         list_handles -> selected_line < list_handles -> first_name 
  976.                 || list_handles -> selected_line > list_handles -> last_name )
  977.         {    /* 
  978.              * Si d‚placement trop grand: 
  979.              * la ligne sort de l'affichage:
  980.              * Il n'y a plus de ligne s‚lectionn‚e:
  981.              */
  982.             list_handles -> selected_line = NIL;
  983.  
  984.             /*
  985.              * Appelle fonction qui: 
  986.              * "Eteinds" les actions qui ne sont plus valides
  987.              * du fait que plus aucune ligne n'est s‚lectionn‚e
  988.              */
  989.              (list_handles -> fixstate_act)( list_handles ); 
  990.         }
  991.         else
  992.         {    /* 
  993.              * Si la ligne ne sort pas de l'affichage:
  994.              * S‚lectionne nouvelle ligne:
  995.              */
  996.             objc_setsel( form_tree, list_handles -> selected_line );    
  997.         }
  998.     }
  999.  
  1000. }
  1001.  
  1002.  
  1003.  
  1004. /*
  1005.  * fixe_liste(-)
  1006.  *
  1007.  * Purpose:
  1008.  * --------
  1009.  * Fixe une s‚rie de lignes
  1010.  * dans une boŒte de dialogue trait‚e par select_in_list()
  1011.  *
  1012.  * Algorythm:
  1013.  * ----------  
  1014.  * - V‚rifie qu'il y a des lignes … fixer
  1015.  * - Fixe objets s‚lectionnables, s'il y en a
  1016.  *
  1017.  * History:
  1018.  * --------
  1019.  * 1993: fplanque: Created
  1020.  * 18.05.94: Prise en compte du fait qu'il peut ne pas y avoir les deux colonnes de textes ds la liste
  1021.  * 04.12.94: ne traite plus qu'une seule liste!
  1022.  * 07.01.95: efface les lignes inoccup‚es … la fin
  1023.  */
  1024. void    fixe_liste( 
  1025.             LISTHANDLES *    list_handles, 
  1026.             int                 first_page, 
  1027.             int                 first_line, 
  1028.             int                 nb_lines )
  1029. {
  1030.     /* 
  1031.      * Pointeurs: 
  1032.      */
  1033.     char         * *path_array;
  1034.     OBJECT    *form_tree = list_handles -> form_tree;
  1035.     int        i;
  1036.     /* 
  1037.      * Objets de d‚part: 
  1038.      */
  1039.     int    obj = list_handles -> first_name + first_line;
  1040.     
  1041.     /* 
  1042.      * Teste s'il y a des lignes … fixer: 
  1043.      */
  1044.     if ( nb_lines )
  1045.     {
  1046.         /* 
  1047.          * Teste s'il faut fixer les lignes ‚ditables:
  1048.          */
  1049.         if ( list_handles -> pTpsz_array != NULL
  1050.                 && (path_array = *( list_handles -> pTpsz_array ) ) != NULL )
  1051.         {
  1052.     
  1053.             /* 
  1054.              * Pointeurs de d‚part: 
  1055.              */        
  1056.             path_array = &path_array[ first_page ];    /* Pointeur sur chemin */
  1057.         
  1058.     
  1059.             /* 
  1060.              * Fixe chemin d'accŠs/nom: objets s‚lectionnables 
  1061.              */
  1062.             for ( i=1; i<=nb_lines; i++ )
  1063.             {    
  1064.                 rlink_teptext( &form_tree[ obj++ ], *(path_array++) );
  1065.             }
  1066.         }
  1067.     }
  1068.     
  1069.     /*
  1070.      * Finit de remplir avec des lignes vides:
  1071.      */
  1072.     while( obj <= list_handles -> last_name )
  1073.     {
  1074.         dlink_teptext( &form_tree[ obj++ ], "" );
  1075.     }
  1076.  
  1077. }
  1078.  
  1079.  
  1080.  
  1081. /*
  1082.  * enable_list(-)
  1083.  *
  1084.  * Purpose:
  1085.  * --------
  1086.  * - Disable des lignes non utilis‚es lorsque la liste est plus courte que
  1087.  * le nbre de lignes physiquement affich‚es … l'‚cran
  1088.  * - Enable des ligne lorsqu'on allonge la liste/ on qu'affiche pour la
  1089.  * premiŠre fois
  1090.  *
  1091.  * History:
  1092.  * --------
  1093.  * 1993: fplanque: Created
  1094.  */
  1095. void    enable_list( 
  1096.             LISTHANDLES *list_handles, 
  1097.             int used_lines )
  1098. {
  1099.     /* 
  1100.      * Pointeurs: 
  1101.      */
  1102.     OBJECT    *form_tree = list_handles -> form_tree;
  1103.  
  1104.     /* 
  1105.      * Variables: 
  1106.      */
  1107.     int    limit = list_handles -> first_name + used_lines;
  1108.     int    i;
  1109.  
  1110.     /*
  1111.      * Parcourt liste: 
  1112.      */
  1113.     for ( i = list_handles -> first_name; i <= list_handles -> last_name; i++ )
  1114.     {    /* 
  1115.          * D‚s‚lectionne slots inutilis‚s: 
  1116.          */
  1117.  
  1118.         if ( i < limit )
  1119.         {    /* 
  1120.             * Si le slot doit ˆtre actif: 
  1121.             */
  1122.             form_tree[ i ] .ob_state &= !DISABLED;
  1123.         }
  1124.         else
  1125.         {    /* 
  1126.               * Si le slot est vide => inactif: 
  1127.               */
  1128.             form_tree[ i ] .ob_state |= DISABLED;
  1129.         }
  1130.     }
  1131.  
  1132. }
  1133.  
  1134.  
  1135. /*
  1136.  * redraw_list(-)
  1137.  *
  1138.  * Purpose:
  1139.  * --------
  1140.  * R‚affiche une liste de s‚lection 
  1141.  * trait‚e par select_in_list()
  1142.  * lorsqu'on change son contenu ou lorsqu'elle scrolle … l'‚cran
  1143.  *
  1144.  * History:
  1145.  * --------
  1146.  * 1993: fplanque: Created
  1147.  */
  1148. void    redraw_list( 
  1149.             LISTHANDLES *list_handles 
  1150.             )
  1151. {
  1152.     OBJECT    *form_tree = list_handles -> form_tree;
  1153.     GRECT        form_box;
  1154.     int         i;
  1155.     
  1156.     objc_xywh( form_tree, ROOT, &form_box );
  1157.     
  1158.     for ( i=list_handles -> first_name; i<=list_handles -> last_name; i++ )
  1159.     {
  1160.         objc_draw( form_tree, i, 1, form_box .g_x, form_box .g_y, form_box .g_w, form_box .g_h );
  1161.     }
  1162.  
  1163.     objc_draw( form_tree, list_handles -> slide_bar, 1, form_box .g_x, form_box .g_y, form_box .g_w, form_box .g_h );
  1164.     
  1165. }
  1166.  
  1167.  
  1168. /*
  1169.  * list_fix1name(-)
  1170.  *
  1171.  * Purpose:
  1172.  * --------
  1173.  * Modifie un nom dans une liste de s‚lection
  1174.  * trait‚e par select_in_list()
  1175.  *
  1176.  * History:
  1177.  * --------
  1178.  * 1993: fplanque: Created
  1179.  */
  1180. void    list_fix1name( 
  1181.             OBJECT *form_tree, 
  1182.             int selected_line, 
  1183.             char *new_name )
  1184. {
  1185.     GRECT        name_box;
  1186.     
  1187.     /* 
  1188.      * Modifie nom dans le formulaire: 
  1189.      */
  1190.     rlink_teptext( &form_tree[ selected_line ], new_name );
  1191.         
  1192.     /* 
  1193.      * Redessine nom: 
  1194.      */
  1195.     objc_xywh( form_tree, selected_line, &name_box );
  1196.     objc_draw( form_tree, selected_line, 1,
  1197.                   name_box .g_x, name_box .g_y, name_box .g_w, name_box .g_h );
  1198.     
  1199. }
  1200.  
  1201.  
  1202. /*
  1203.  * get_no_selitem(-)
  1204.  *
  1205.  * Purpose:
  1206.  * --------
  1207.  * Fournit le No d'ordre de l'elt s‚lectionn‚
  1208.  * ds la liste textuelle actuellement g‚r‚e par select_in_list()
  1209.  *
  1210.  * Algorythm:
  1211.  * ----------  
  1212.  * no d'ordre =  no d'ordre de l'elt sur objet du haut 
  1213.  *                 + no d'objet selectionn‚
  1214.  *                    - no d'objet du haut
  1215.  *
  1216.  * Notes:
  1217.  * ------
  1218.  * Le no renvoy‚ est dans l'int 0..nb_elts-1
  1219.  * Cette func serait incluse dans la classe LISTHANDLES en C++
  1220.  *
  1221.  * History:
  1222.  * --------
  1223.  * 05.01.93: fplanque: Created
  1224.  */
  1225. int get_no_selitem(                        /* Out: No d'ordre ds liste textuelle de l'elt s‚lectionn‚ */
  1226.         LISTHANDLES *list_handles )    /* In: Infos sur la liste textuelle actuellement affich‚e */
  1227. {
  1228.     return    list_handles -> top_item + list_handles -> selected_line - list_handles -> first_name;
  1229. }
  1230.  
  1231.  
  1232. /*
  1233.  * reperes_sel(-)
  1234.  *
  1235.  * Purpose:
  1236.  * --------
  1237.  * Prise de repŠres et initialisations dans un arbre d'obj s‚lecteur
  1238.  * Cette func est appell‚e pour chaque objet de la boite de dialogue
  1239.  * select_in_list() -> maptree() -> reperes_sel()
  1240.  *
  1241.  * History:
  1242.  * --------
  1243.  * 1993: fplanque: Created
  1244.  * 07.01.95: n'init plus les lignes en ""
  1245.  */
  1246. int    reperes_sel( 
  1247.             OBJECT *    tree, 
  1248.             int         obj )
  1249. {
  1250.     /* printf("%d ",obj); */
  1251.     int    ext_type = tree[ obj ] .ob_type >>8;
  1252.     
  1253.     /* 
  1254.      * Prise de repŠres: 
  1255.      */
  1256.     switch( ext_type )
  1257.     {
  1258.         case    3:
  1259.             /* printf("First name: %d\n", obj);*/
  1260.             M_maptree_vars .first_name = obj;
  1261.             M_init_text = TRUE_1;            /* On commence … initialiser les champs */
  1262.             break;
  1263.     
  1264.         case    4:
  1265.             /* printf("Last name: %d\n", obj);*/
  1266.             M_maptree_vars .last_name = obj;
  1267.             M_init_text = ESC;            /* On va s'arrˆter d'initialiser */
  1268.             break;
  1269.     
  1270.         case    11:
  1271.             /* printf("Arrow UP: %d\n", obj);*/
  1272.             M_maptree_vars .arrow_up = obj;
  1273.             break;
  1274.     
  1275.         case    12:
  1276.             /*    printf("Arrow DOWN: %d\n", obj);*/
  1277.             M_maptree_vars .arrow_down = obj;
  1278.             break;
  1279.     
  1280.         case    13:
  1281.             /*    printf("Cage: %d\n", obj); */
  1282.             M_maptree_vars .slide_bar = obj;
  1283.             break;
  1284.     
  1285.         case    14:
  1286.             /* printf("Ascenseur: %d\n", obj);*/
  1287.             M_maptree_vars .slide_csr = obj;
  1288.             break;
  1289.     }
  1290.  
  1291.  
  1292.     return    TRUE_1;
  1293. }
  1294.  
  1295.